/* jQuery Password Strength Plugin (pstrength) - A jQuery plugin to provide accessibility functions
 * Author: Tane Piper (digitalspaghetti@gmail.com)
 * Website: http://digitalspaghetti.me.uk
 * Licensed under the MIT License: http://www.opensource.org/licenses/mit-license.php
 * This code uses a modified version of Steve Moitozo's algorithm (http://www.geekwisdom.com/dyn/passwdmeter)
 *
 * === Changelog ===
 * Version 1.2 (03/09/2007)
 * Added more options for colors and common words
 * Added common words checked to see if words like 'password' or 'qwerty' are being entered
 * Added minimum characters required for password
 * Re-worked scoring system to give better results
 *
 * Version 1.1 (20/08/2007)
 * Changed code to be more jQuery-like
 *
 * Version 1.0 (20/07/2007)
 * Initial version.
 */
;(function($){
    $.extend($.fn, {
        pstrength : function(options) {
            var options = $.extend({
                verdects:    ["非常弱","比较弱","中等强度","比较强","非常强"],
                colors:     ["#f00","#c06", "#f60","#3c0","#3f0"],
                scores:     [10,15,30,40],
                common:        ["password","sex","god","123456","123","bit","sme"],
                minchar:    6
            },options);
            return this.each(function(){
                var infoarea = $(this).attr('id');
                //$(this).after('<div class="pstrength-minchar" id="' + infoarea + '_minchar">The minimum number of characters is ' + options.minchar + '</div>');
                $(this).after('<div class="pstrength-info" id="' + infoarea + '_text"></div>');
                $(this).after('<div class="pstrength-bar" id="' + infoarea + '_bar" style="border: 1px solid white; font-size: 1px; height: 8px; width: 0px; max-width: 80%;"></div>');
                $(this).keyup(function(){
                    $.fn.runPassword($(this).val(), infoarea, options);
                });
            });
        },
        runPassword : function (password, infoarea, options){
            // Check password
            nPerc = $.fn.checkPassword(password, options);
            // Get controls
            var ctlBar = "#" + infoarea + "_bar";
            var ctlText = "#" + infoarea + "_text";
            // Color and text
            if (nPerc == -200) {
                strColor = '#f00';
                strText = '不安全的密码字符串!';
                $(ctlBar).css({width: "0%"});
            }
            else if (nPerc < 0 && nPerc > -199) {
                strColor = '#ccc';
                strText = '密码太短';
                $(ctlBar).css({width: "1%"});
            }
            else if(nPerc <= options.scores[0])
            {
                   strColor = options.colors[0];
                strText = options.verdects[0];
                $(ctlBar).css({width: "5%"});
            }
            else if (nPerc > options.scores[0] && nPerc <= options.scores[1])
            {
                   strColor = options.colors[1];
                strText = options.verdects[1];
                $(ctlBar).css({width: "25%"});
            }
            else if (nPerc > options.scores[1] && nPerc <= options.scores[2])
            {
                   strColor = options.colors[2];
                strText = options.verdects[2];
                $(ctlBar).css({width: "40%"});
            }
            else if (nPerc > options.scores[2] && nPerc <= options.scores[3])
            {
                   strColor = options.colors[3];
                strText = options.verdects[3];
                $(ctlBar).css({width: "50%"});
            }
            else
            {
                   strColor = options.colors[4];
                strText = options.verdects[4];
                $(ctlBar).css({width: "63%"});
            }
            $(ctlBar).css({backgroundColor: strColor});
            $(ctlText).html("<span style='color: " + strColor + ";'>" + strText + "</span>");
        },
        checkPassword : function(password, options)
        {
            var intScore = 0;
            var strVerdict = options.verdects[0];
            // PASSWORD LENGTH
            if (password.length < options.minchar)                         // Password too short
            {
                intScore = (intScore - 100)
            }
            else if (password.length >= options.minchar && password.length <= (options.minchar + 2)) // Password Short
            {
                intScore = (intScore + 6)
            }
            else if (password.length >= (options.minchar + 3) && password.length <= (options.minchar + 4))// Password Medium
            {
                intScore = (intScore + 12)
            }
            else if (password.length >= (options.minchar + 5))                    // Password Large
            {
                intScore = (intScore + 18)
            }
            if (password.match(/[a-z]/))                              // [verified] at least one lower case letter
            {
                intScore = (intScore + 1)
            }
            if (password.match(/[A-Z]/))                              // [verified] at least one upper case letter
            {
                intScore = (intScore + 5)
            }
            // NUMBERS
            if (password.match(/\d+/))                                 // [verified] at least one number
            {
                intScore = (intScore + 5)
            }
            if (password.match(/(.*[0-9].*[0-9].*[0-9])/))             // [verified] at least three numbers
            {
                intScore = (intScore + 7)
            }
            // SPECIAL CHAR
            if (password.match(/.[!,@,#,$,%,^,&,*,?,_,~]/))            // [verified] at least one special character
            {
                intScore = (intScore + 5)
            }
            // [verified] at least two special characters
            if (password.match(/(.*[!,@,#,$,%,^,&,*,?,_,~].*[!,@,#,$,%,^,&,*,?,_,~])/))
            {
                intScore = (intScore + 7)
            }
            // COMBOS
            if (password.match(/([a-z].*[A-Z])|([A-Z].*[a-z])/))        // [verified] both upper and lower case
            {
                intScore = (intScore + 2)
            }
            if (password.match(/([a-zA-Z])/) && password.match(/([0-9])/)) // [verified] both letters and numbers
            {
                intScore = (intScore + 3)
            }
             // [verified] letters, numbers, and special characters
            if (password.match(/([a-zA-Z0-9].*[!,@,#,$,%,^,&,*,?,_,~])|([!,@,#,$,%,^,&,*,?,_,~].*[a-zA-Z0-9])/))
            {
                intScore = (intScore + 3)
            }
            for (var i=0; i < options.common.length; i++) {
                if (password.toLowerCase() == options.common[i]) {
                    intScore = -200;
                }
            }
            return intScore;
        }
    });
})(jQuery);